<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="W3chW" id="W3chW"><span data-lake-id="u60272726" id="u60272726">典型回答</span></h1>
  <p data-lake-id="u3b9a97f9" id="u3b9a97f9"><br></p>
  <p data-lake-id="ue235d274" id="ue235d274"><span data-lake-id="u9b149b73" id="u9b149b73">CAS是一种基本的原子操作，用于解决并发问题。在操作系统层面，CAS 操作的原理是基于硬件提供的原子操作指令。在x86架构的CPU中，CAS 操作通常使用 cmpxchg 指令实现。</span></p>
  <p data-lake-id="u5022dc4d" id="u5022dc4d"><span data-lake-id="u1d0d33c6" id="u1d0d33c6">​</span><br></p>
  <p data-lake-id="u76283ce1" id="u76283ce1"><span data-lake-id="u1990ea8f" id="u1990ea8f">为啥cmpxchg指令可以保证原子性呢？主要由以下几个方面的保障：</span></p>
  <p data-lake-id="u3706244c" id="u3706244c"><span data-lake-id="u901eb9b4" id="u901eb9b4">​</span><br></p>
  <ol list="u6a8c5165">
   <li fid="u718de100" data-lake-id="ucf303228" id="ucf303228"><span data-lake-id="u94a5a940" id="u94a5a940">cmpxchg 指令是一条原子指令。</span><strong><span data-lake-id="u2aa89229" id="u2aa89229">在 CPU 执行 cmpxchg 指令时，处理器会自动锁定总线</span></strong><span data-lake-id="u290b31fd" id="u290b31fd">，防止其他 CPU 访问共享变量，然后执行比较和交换操作，最后释放总线。</span></li>
  </ol>
  <p data-lake-id="uad493268" id="uad493268"><br></p>
  <ol list="u6a8c5165" start="2">
   <li fid="u718de100" data-lake-id="u7e1a8deb" id="u7e1a8deb"><span data-lake-id="uc63a01fc" id="uc63a01fc">cmpxchg 指令在执行期间，</span><strong><span data-lake-id="u9654fd1e" id="u9654fd1e">CPU 会自动禁止中断</span></strong><span data-lake-id="u6192b026" id="u6192b026">。这样可以确保 CAS 操作的原子性，避免中断或其他干扰对操作的影响。</span></li>
  </ol>
  <p data-lake-id="uffe171cf" id="uffe171cf"><br></p>
  <ol list="u6a8c5165" start="3">
   <li fid="u718de100" data-lake-id="uc6443a67" id="uc6443a67"><span data-lake-id="ucf003dc0" id="ucf003dc0">cmpxchg 指令是硬件实现的，可以保证其原子性和正确性。CPU 中的硬件电路确保了 cmpxchg 指令的正确执行，以及对共享变量的访问是原子的。</span></li>
  </ol>
  <p data-lake-id="ue9789e39" id="ue9789e39"><br></p>
  <h1 data-lake-id="Wghmg" id="Wghmg"><span data-lake-id="u7e111195" id="u7e111195">扩展知识</span></h1>
  <p data-lake-id="ua396264e" id="ua396264e"><br></p>
  <h2 data-lake-id="aMaCr" id="aMaCr"><span data-lake-id="u714304c1" id="u714304c1">CAS的可见性保障</span></h2>
  <p data-lake-id="uf6155d0d" id="uf6155d0d"><br></p>
  <p data-lake-id="u1f883dfd" id="u1f883dfd"><span data-lake-id="u7d930fe1" id="u7d930fe1">同样是因为cmpxchg 指令，</span><strong><span data-lake-id="ufe1c188c" id="ufe1c188c">这个指令是基于 CPU 缓存一致性协议实现的</span></strong><span data-lake-id="u4c5877ed" id="u4c5877ed">。在多核 CPU 中，所有核心的缓存都是一致的。当一个 CPU 核心执行 cmpxchg 指令时，其他 CPU 核心的缓存会自动更新，以确保对共享变量的访问是一致的。</span></p>
 </body>
</html>